package main

import (
	"fmt"
	"time"
)

/*
完成goroutine和channel协同工作的案例，具体要求：
(1)开启一个writeData协程，向管道intChan中写入50个整数
(2)开启一个readData协程，从管道intChan中读取writeData写入的数据
(3)注意：writeData和readData操作的是同一个管道
(4)主线程需要等待writeData和readData协程都完成工作才能退出
*/
func writeData(intChan chan int) {
	for i := 1; i <= 50; i++ {
		//放入数据
		intChan <- i
		fmt.Printf("writeData 写入数据=%v\n", i)
	}
	close(intChan) //关闭
}
func readData(intChan chan int, exitChan chan bool) {
	for {
		v, ok := <-intChan
		if !ok {
			break
		}
		time.Sleep(time.Second)
		fmt.Printf("readData 读到数据=%v\n", v)
	}
	//readData读取完数据后，即任务完成
	exitChan <- true
	close(exitChan)
}
func main() {
	//创建两个管道
	intChan := make(chan int, 10)
	exitChan := make(chan bool, 1)
	go writeData(intChan)
	go readData(intChan, exitChan)
	for {
		_, ok := <-exitChan
		if !ok {
			break
		}
	}
}

/*
func main(){
	intChan:=make(chan int,10) //10->50 的话数据一下就放入了
	exitChan:=make(chan bool,1)
	go writeData(intChan)
	// go readData(intChan,exitChan)
	...
}
问题：如果注销掉go readData(intChan,exitChan)，程序会怎么样？
回答：如果只是向管道写入数据，而没有读取，就会出现阻塞而deadlock，原因是intChan容量是10,
而代码writeData会写入50个数据，因此会阻塞在writeData的intChan<-i

如果编译器运行，发现一个管道，只有写，而没有读，则该管道，会阻塞

写管道和读管道的频率不一致，无所谓，不会发生deadlock
*/
